package com.suxii.procotol;

import com.google.gson.Gson;
import com.suxii.pojo.Msg;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageCodec;

import java.nio.charset.StandardCharsets;
import java.util.List;

/*
自定义加密解密包
 */
public class ChatCodec extends ByteToMessageCodec<Msg> {
    /*
    编码
     */
    @Override
    public void encode(ChannelHandlerContext ctx, Msg msg, ByteBuf out) throws Exception {
        // 1.四字节的魔数
        out.writeBytes(new byte[]{1,2,3,4});
        // 2.一字节的版本
        out.writeByte(1);
        // 3.一字节的序列化方式 0jdk, 1json
        out.writeByte(0);
        // 4.一字节的消息类型
        out.writeByte(msg.getType());
        // 5.四字节uid
        //out.writeInt(msg.getUid());
        // 一字节无意义
        out.writeByte(0xff);
        // 6.获取内容的字节数组
        // json序列化算法
        String json=new Gson().toJson(msg);
        byte[] bytes = json.getBytes(StandardCharsets.UTF_8);
        // 7.四字节长度
        out.writeInt(bytes.length);
        // 8.写入内存
        out.writeBytes(bytes);

    }

    /*
    解码
     */
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> list) throws Exception {
        int magicNum = in.readInt(); //魔数
        byte version = in.readByte(); // 版本
        byte type = in.readByte(); // 序列化方式
        byte chatType = in.readByte();// 消息类型
        //int uid = in.readInt();//四字节uid
        in.readByte();//无意义
        int length = in.readInt(); //内容长度
        // 读取内容
        byte[] bytes = new byte[length];
        in.readBytes(bytes,0,length);

        // 反序列化
        //json
        String json = new String(bytes, StandardCharsets.UTF_8);
        Object message = new Gson().fromJson(json, Msg.getMsgClass(chatType));

        list.add(message);
    }
}
